From 2d7405d9c605bf6882d123c861c0afb6451edfae Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Wed, 27 Sep 2006 12:11:46 +0000 Subject: [PATCH] unref the virtual root path once that node (or one if its ancestors) is 2006-09-26 Kristian Rietveld * gtk/gtktreemodelfilter.c (gtk_tree_model_filter_init), (gtk_tree_model_filter_finalize), (gtk_tree_model_filter_row_deleted), (gtk_tree_model_filter_new): unref the virtual root path once that node (or one if its ancestors) is deleted, set virtual_root_deleted so we only unref it once. --- ChangeLog | 8 ++++++++ gtk/gtktreemodelfilter.c | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3b00f9d471..0a382d1a90 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-09-26 Kristian Rietveld + + * gtk/gtktreemodelfilter.c (gtk_tree_model_filter_init), + (gtk_tree_model_filter_finalize), (gtk_tree_model_filter_row_deleted), + (gtk_tree_model_filter_new): unref the virtual root path once that + node (or one if its ancestors) is deleted, set virtual_root_deleted + so we only unref it once. + 2006-09-26 Kristian Rietveld * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_changed), diff --git a/gtk/gtktreemodelfilter.c b/gtk/gtktreemodelfilter.c index 184309981a..5a463a9b40 100644 --- a/gtk/gtktreemodelfilter.c +++ b/gtk/gtktreemodelfilter.c @@ -105,6 +105,7 @@ struct _GtkTreeModelFilterPrivate gboolean modify_func_set; gboolean in_row_deleted; + gboolean virtual_root_deleted; /* signal ids */ guint changed_id; @@ -290,6 +291,7 @@ gtk_tree_model_filter_init (GtkTreeModelFilter *filter) filter->priv->visible_method_set = FALSE; filter->priv->modify_func_set = FALSE; filter->priv->in_row_deleted = FALSE; + filter->priv->virtual_root_deleted = FALSE; } static void @@ -359,8 +361,11 @@ gtk_tree_model_filter_finalize (GObject *object) { GtkTreeModelFilter *filter = (GtkTreeModelFilter *) object; - if (filter->priv->virtual_root) - gtk_tree_model_filter_unref_path (filter, filter->priv->virtual_root); + if (filter->priv->virtual_root && !filter->priv->virtual_root_deleted) + { + gtk_tree_model_filter_unref_path (filter, filter->priv->virtual_root); + filter->priv->virtual_root_deleted = TRUE; + } gtk_tree_model_filter_set_model (filter, NULL); @@ -1620,6 +1625,9 @@ gtk_tree_model_filter_row_deleted (GtkTreeModel *c_model, GtkTreePath *path; FilterLevel *level = FILTER_LEVEL (filter->priv->root); + gtk_tree_model_filter_unref_path (filter, filter->priv->virtual_root); + filter->priv->virtual_root_deleted = TRUE; + if (!level) return; @@ -2835,7 +2843,10 @@ gtk_tree_model_filter_new (GtkTreeModel *child_model, filter = GTK_TREE_MODEL_FILTER (retval); if (filter->priv->virtual_root) - gtk_tree_model_filter_ref_path (filter, filter->priv->virtual_root); + { + gtk_tree_model_filter_ref_path (filter, filter->priv->virtual_root); + filter->priv->virtual_root_deleted = FALSE; + } return retval; } -- 2.30.2